// 引入模块
const express = require('express');
const cors = require('cors');
// 引入用于生成jwt字符串的包
const jwt = require('jsonwebtoken');
// 引入用于将客户端发送过来的JWT字符串，解析还原成JSON对象的包
const expressJWT = require('express-jwt');
// 引入db.js  自定义模块
const db = require('./db')
// 创建服务器
const app = express();
// 设置中间件 跨域
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({
    extended: false
}));

// 默认这个中间件会拦截所有的请求，判断这些请求是否携带了token
// unless可以排除哪些接口不需要携带token
app.use(
    expressJWT({ secret: 'itheima-83', algorithms: ['HS256'] }).unless({
      path: [/^\/login/],
    })
)

  
// 启动服务器
app.listen(3000, function () {
    console.log('服务器启动成功了');
})

// 查询全部书籍
app.get('/api/getbooks', async function (req, res) {
    const data = await db.getBooks();
    res.send({
        status: 200,
        msg: '获取图书列表成功',
        data: data
    })
})


// 删除书籍
app.get('/api/delbook', async function (req, res) {
    const {
        id
    } = req.query
    const data = await db.delBook(id);
    console.log(data);
    if (data.affectedRows === 1) {
        res.send({
            status: 200,
            msg: '删除图书成功'
        })
    } else {
        res.send({
            status: 400,
            msg: '删除图书失败'
        })
    }
})


// 添加书籍
app.post('/api/addbook', async function (req, res) {
    // console.log(req.body);
    // post用body获取请求体内容 要先设置中间件
    const data = await db.addBook(req.body);
    if (data.affectedRows === 1) {
        res.send({
            status: 201,
            msg: '添加图书成功',
            data,
        })
    } else {
        res.send({
            status: 500,
            msg: '添加图书失败'
        })
    }
})


// 登录
app.post('/login', async function (req, res) {
    // post请求体中解构用户名和密码
    const {
        username,
        password
    } = req.body;
    db.pool.query('select * from user where username = ? and password = ?', [username, password], (err, r) => {
        if (err) return console.log(err);
        if (r.length > 0) {
            res.send({
                status: 200,
                msg: '登陆成功',
                // 调用jwt.sign()生成JWT字符串, 三个参数分别是:用户信息对象、加密密钥、配置对象(多久时间过期token)
                token: 'Bearer ' + jwt.sign({
                    username: username,
                }, 'itheima-83', {
                    expiresIn: '24h'
                })
            })
        } else {
            res.send({
                status: 201,
                msg: '用户名或密码错误'
            })
        }
    })
})

// 统一的处理后端的错误
// express的错误中间件
app.use((err, req, res, next) => {
    res.send({
        msg: '服务器繁忙',
        status: 401
    })
})